package org.convallaria.system.biz.util;

import org.convallaria.framework.common.constants.sys.PostConstants;
import org.convallaria.system.biz.entity.SysPost;

/**
 * 系统岗位工具类
 * 
 * 功能特性：
 * - 提供岗位相关的业务逻辑判断方法
 * - 提供岗位状态等描述信息
 * - 提供岗位数据验证方法
 * - 提供岗位信息格式化方法
 * 
 * 设计原则：
 * - 纯静态方法，无状态
 * - 业务逻辑与实体类分离
 * - 便于单元测试
 * - 提高代码可维护性
 * 
 * @author convallaria
 * @since 1.0.0
 */
public class SysPostUtils {

    // ==================== 状态判断方法 ====================

    /**
     * 判断岗位是否正常状态
     * 
     * @param post 岗位对象
     * @return true=正常，false=停用
     */
    public static boolean isNormal(SysPost post) {
        if (post == null || post.getStatus() == null) {
            return false;
        }
        return PostConstants.POST_STATUS_NORMAL.equals(post.getStatus());
    }

    /**
     * 判断岗位是否停用状态
     * 
     * @param post 岗位对象
     * @return true=停用，false=正常
     */
    public static boolean isDisabled(SysPost post) {
        if (post == null || post.getStatus() == null) {
            return false;
        }
        return PostConstants.POST_STATUS_DISABLED.equals(post.getStatus());
    }

    /**
     * 判断岗位状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidStatus(String status) {
        return PostConstants.isValidPostStatus(status);
    }

    // ==================== 数据验证方法 ====================

    /**
     * 验证岗位信息是否完整
     * 
     * @param post 岗位对象
     * @return true=完整，false=不完整
     */
    public static boolean isValidPost(SysPost post) {
        if (post == null) {
            return false;
        }
        
        // 必填字段验证
        if (!PostConstants.isValidPostCode(post.getPostCode())) {
            return false;
        }
        if (!PostConstants.isValidPostName(post.getPostName())) {
            return false;
        }
        if (post.getTenantId() == null) {
            return false;
        }
        
        // 状态验证
        if (!isValidStatus(post.getStatus())) {
            return false;
        }
        
        // 显示顺序验证
        if (post.getPostSort() != null && !PostConstants.isValidPostSort(post.getPostSort())) {
            return false;
        }
        
        return true;
    }

    /**
     * 验证岗位编码格式
     * 
     * @param postCode 岗位编码
     * @return true=有效，false=无效
     */
    public static boolean isValidPostCode(String postCode) {
        return PostConstants.isValidPostCode(postCode);
    }

    /**
     * 验证岗位名称格式
     * 
     * @param postName 岗位名称
     * @return true=有效，false=无效
     */
    public static boolean isValidPostName(String postName) {
        return PostConstants.isValidPostName(postName);
    }

    /**
     * 验证显示顺序格式
     * 
     * @param postSort 显示顺序
     * @return true=有效，false=无效
     */
    public static boolean isValidPostSort(Integer postSort) {
        return PostConstants.isValidPostSort(postSort);
    }

    // ==================== 格式化方法 ====================

    /**
     * 格式化岗位显示名称
     * 
     * @param post 岗位对象
     * @return 格式化后的显示名称
     */
    public static String formatDisplayName(SysPost post) {
        if (post == null) {
            return "未知岗位";
        }
        
        return PostConstants.formatPostDisplayName(post.getPostCode(), post.getPostName());
    }

    /**
     * 格式化岗位完整信息
     * 
     * @param post 岗位对象
     * @return 格式化后的完整信息
     */
    public static String formatPostInfo(SysPost post) {
        if (post == null) {
            return "岗位信息为空";
        }
        
        StringBuilder sb = new StringBuilder();
        sb.append("岗位ID: ").append(post.getPostId()).append(", ");
        sb.append("岗位编码: ").append(post.getPostCode()).append(", ");
        sb.append("岗位名称: ").append(post.getPostName()).append(", ");
        sb.append("状态: ").append(getStatusDesc(post.getStatus())).append(", ");
        sb.append("显示顺序: ").append(post.getPostSort());
        
        return sb.toString();
    }

    /**
     * 格式化岗位编码（清理特殊字符）
     * 
     * @param postCode 原始岗位编码
     * @return 清理后的岗位编码
     */
    public static String formatPostCode(String postCode) {
        return PostConstants.cleanPostCode(postCode);
    }

    /**
     * 格式化岗位名称（清理多余空格）
     * 
     * @param postName 原始岗位名称
     * @return 清理后的岗位名称
     */
    public static String formatPostName(String postName) {
        return PostConstants.cleanPostName(postName);
    }

    // ==================== 描述信息方法 ====================

    /**
     * 获取岗位状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getStatusDesc(String status) {
        return PostConstants.getPostStatusDesc(status);
    }

    // ==================== 业务逻辑方法 ====================

    /**
     * 判断岗位是否可以删除
     * 
     * @param post 岗位对象
     * @return true=可以删除，false=不能删除
     */
    public static boolean canDelete(SysPost post) {
        if (post == null) {
            return false;
        }
        
        // 停用的岗位可以删除
        return isDisabled(post);
    }

    /**
     * 判断岗位是否可以编辑
     * 
     * @param post 岗位对象
     * @return true=可以编辑，false=不能编辑
     */
    public static boolean canEdit(SysPost post) {
        if (post == null) {
            return false;
        }
        
        // 正常状态的岗位可以编辑
        return isNormal(post);
    }

    /**
     * 判断岗位是否可以选择
     * 
     * @param post 岗位对象
     * @return true=可以选择，false=不能选择
     */
    public static boolean canSelect(SysPost post) {
        if (post == null) {
            return false;
        }
        
        // 正常状态的岗位可以选择
        return isNormal(post);
    }

    /**
     * 判断岗位编码是否重复
     * 
     * @param post1 岗位对象1
     * @param post2 岗位对象2
     * @return true=重复，false=不重复
     */
    public static boolean isPostCodeDuplicate(SysPost post1, SysPost post2) {
        if (post1 == null || post2 == null) {
            return false;
        }
        return PostConstants.isPostCodeDuplicate(post1.getPostCode(), post2.getPostCode());
    }

    /**
     * 判断岗位名称是否重复
     * 
     * @param post1 岗位对象1
     * @param post2 岗位对象2
     * @return true=重复，false=不重复
     */
    public static boolean isPostNameDuplicate(SysPost post1, SysPost post2) {
        if (post1 == null || post2 == null) {
            return false;
        }
        return PostConstants.isPostNameDuplicate(post1.getPostName(), post2.getPostName());
    }

    /**
     * 判断岗位信息是否重复（编码或名称）
     * 
     * @param post1 岗位对象1
     * @param post2 岗位对象2
     * @return true=重复，false=不重复
     */
    public static boolean isPostInfoDuplicate(SysPost post1, SysPost post2) {
        return isPostCodeDuplicate(post1, post2) || isPostNameDuplicate(post1, post2);
    }

    /**
     * 比较岗位显示顺序
     * 
     * @param post1 岗位对象1
     * @param post2 岗位对象2
     * @return 比较结果：负数表示post1在前，正数表示post2在前，0表示相等
     */
    public static int comparePostSort(SysPost post1, SysPost post2) {
        if (post1 == null && post2 == null) {
            return 0;
        }
        if (post1 == null) {
            return 1;
        }
        if (post2 == null) {
            return -1;
        }
        
        Integer sort1 = post1.getPostSort();
        Integer sort2 = post2.getPostSort();
        
        if (sort1 == null && sort2 == null) {
            return 0;
        }
        if (sort1 == null) {
            return 1;
        }
        if (sort2 == null) {
            return -1;
        }
        
        return sort1.compareTo(sort2);
    }

    /**
     * 判断岗位是否为空
     * 
     * @param post 岗位对象
     * @return true=为空，false=不为空
     */
    public static boolean isEmpty(SysPost post) {
        if (post == null) {
            return true;
        }
        
        return (post.getPostCode() == null || post.getPostCode().trim().isEmpty()) &&
               (post.getPostName() == null || post.getPostName().trim().isEmpty());
    }

    /**
     * 判断岗位是否有效（非空且状态正常）
     * 
     * @param post 岗位对象
     * @return true=有效，false=无效
     */
    public static boolean isValid(SysPost post) {
        return !isEmpty(post) && isNormal(post);
    }
}
